#include <memory>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

shared_ptr<string> factory(const char*);
void printVec(vector<shared_ptr<string>>&);

template <typename T> struct Blob
{
    Blob(): data({}) {};
    Blob(initializer_list<T> il): data(il) {};
    vector<T> data;
};

int main()
{
    vector<shared_ptr<string>> vec = {factory("a"), factory("b"), factory("c")};
    printVec(vec);
    // 当使用容器存放 shared_ptr 时，容器中不再需要的元素要记得删除
    vec.erase(vec.begin() + 2);
    printVec(vec);

    vector<string> v1; // 空 vector
    { // 新作用域
        vector<string> v2 = {"a", "an", "the"};
        v1 = v2; // 从 v2 拷贝元素到 v1 中
    } // v2 被销毁，其中的元素也被销毁
    // v1 有三个元素，是原来 v2 中元素的拷贝

    Blob<string> b1; // 空 Blob
    { // 新作用域
        Blob<string> b2 = {"a", "an", "the"};
        b1 = b2; // b1 和 b2 共享相同的元素
    } // b2 被销毁了，但 b2 中的元素不能销毁
    // b1 指向最初由 b2 创建的元素

    // 使用动态内存的原因：程序需要在多个对象间共享数据
}

shared_ptr<string> factory(const char* arg)
{
    return make_shared<string>(arg);
}

void printVec(vector<shared_ptr<string>> &v)
{
    for (auto p : v)
        cout << *p << " ";
    cout << endl;
}